<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // var没有块作用域的概念，只有全局变量和函数内作用域

        var g1 = 10;
        function f1() {
            var local1 = 10;
            // 函数内可以访问全局变量，打印10
            console.log(g1);
            // 可以改变全局变量
            g1 = 1;
            // 打印1
            console.log(g1);

            // 未定义i使用，变量提升
            console.log(i)
            for (var i = 0; i < 10; i++) {

            }
            // for循环内定义的变量可以在外部使用，打印10
            console.log(i);


        }

        let g2 = 10;
        function f2() {
            let local1 = 10;
            // let声明的局部变量；必须声明后使用
            console.log(local1);

            for (let i = 0; i < 10; i++) {

            }
            // let具有块作用域，下面打印会报错Uncaught ReferenceError: i is not defined
            // console.log(i)

            if (true) {
                let v1 = 10;
                let v2 = 3;
                if (true) {
                    let v1 = 5;
                    v2 = 2;
                }
                // 内层块作用域可以声明同名变量，而不影响外层同名变量
                console.log("v1 : " + v1)
                // 内层块可以访问外层块的变量
                console.log("v2 : " + v2)
            }
        }

        f1();
        f2();

    </script>
</body>

</html>